/*
创建了 student 类的对象 s1，由于没有传递参数，调用 student 的===无参构造函数。
调用 student 的无参构造函数时，===先调用基类 person 的无参构造函数（因为没有显式调用有参构造函数），输出 "父类无参构造"。
然后执行 student 无参构造函数的代码，输出 "子类无参构造"。
调用 s1.show_date() 方法：
该方法会输出 name、person::age、this->sex 和 this->id 的值。

*/

#include <iostream>
#include <string>

using namespace std;

class person
{
public:
	string name;
	string sex;
	int age;
	person()
	{
		name = "叽里呱啦";
		age = 88;
		sex = "变种";
		cout << "父类无参构造" << endl;
	}
	~person()
	{
		cout << "我是父类的析构" << endl;
	}
	person(string name, int age, string sex) : name(name), age(age), sex(sex)
	{

		cout << "父类有参构造" << endl;
	}
};
class student : public person
{
public:
	int id;
	student()
	{
		name = "未设置姓名";
		age = -1;
		sex = "沃尔玛塑料袋";
		id = -1;
		cout << "子类无参构造" << endl;
	}
	~student() { cout << "我是子类的析构" << endl; }
	student(string name, int age, string sex, int id) : person(name, age, sex), id(id)
	{
		cout << "子类有参构造" << endl;
	}

	void show_date()
	{
		// 子类内调用父类的成员属性
		cout << "姓名:" << name << endl;		   // 直接使用 子类没有重名的情况下 可以使用
		cout << "年龄:" << person::age << endl; // 使用父类做区分 子类有重名的情况下 可以使用
		cout << "性别:" << this->sex << endl;   // 和第一种一样
		//
		cout << "学号:" << this->id << endl;
	}
};

int main(int argc, char const *argv[])
{
	// 使用无参构造函数初始化
	// student s1;
	// s1.show_date();

	// 使用有参构造函数初始化
	// student s2("哗啦哗啦", 18, "女", 1024);
	// s2.show_date();

	// 使用动态分配
	// student *s3 = new student("稀里哗啦", 8, "男", 1024);
	// s3->show_date();
	// delete s3;
	return 0;
}
